package 动态规划;
/*
一条包含字母 A-Z 的消息通过以下方式进行了编码：

'A' -> 1
'B' -> 2
...
'Z' -> 26
给定一个只包含数字的非空字符串，请计算解码方法的总数。

示例 1:
输入: "12"
输出: 2
解释: 它可以解码为 "AB"（1 2）或者 "L"（12）。

 */
public class 解码方法 {
	/*
例如：12224，我们首先对第一位，只能1这种解码方法。
对第二位2，可以1-2（独立），也可以12（合并），两种解码方法。
对第三位2，可以1-2-2（独立），也可以12-2（独立），也可以1-22（合并），三种解码方法。
在这一步我们发现其实到当前位为止的解码方法个数，就是
上一步的解码方法个数（在后面直接添加独立的一位）+上一步独立的个数（当然这里要判断能不能合并在一起）。
	 */
    public int numDecodings(String s) {
    	if (s == null || s.length() == 0) {
            return 0;
        }
    	//边界条件，如果第一位是字符0，那么完全不能解码，直接返回0
    	if (s.charAt(0)=='0') {
			return 0;
		}
	    int t1=1; //t1表示当前独立可合并下一位的个数
	    int t2=1; //t2表示当前总的解码方式的个数
	    int sum1;
	    int t3;
    	int len=s.length();
    	for (int i = 1; i < len; i++) {
    		sum1=10*(s.charAt(i-1)-'0')+(s.charAt(i)-'0');//跟前一位合并，计算合并之后的数值
    		if(sum1>=1 && sum1<=26) {//如果数值符合条件，那么可以合并
    			 if(s.charAt(i)!='0') {//当前位不是0，那么t2加上t1的值，t1变成原本t2的值
                     t3=t2;
                     t2+=t1;
                     t1=t3;
                 }else{//当前位是0，比如10这种情况，那么t2变成t1的值，t1清空
                     t2=t1;
                     t1=0;
                 }
    		}else{//如果计算出来不能合并
    			 if(s.charAt(i)!='0')//如果当前位不是0，比如227，后面的27就不能合并，于是t2不变，t1变成t2的数值
                     t1=t2;
                 else//如果当前位是0，又不能合并，比如30这种情况，那么直接返回0
                     return 0;
    		 }
		}
    	return t2;//最终返回t2这个总的解码方式的个数

    }
}
